package cn.wintersun.baseweb.service.impl;


import cn.wintersun.basecommon.common.Result;
import cn.wintersun.basecommon.common.ResultCode;
import cn.wintersun.baseweb.dao.User;
import cn.wintersun.baseweb.service.intrer.ModelService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;

@Service
@Slf4j
public class ModelServiceImpl implements ModelService {

    @Value("${file.save-folder}")
    private String SAVE_FOLDER;
    @Value("${file.upload-folder}")
    private String UPLOAD_FOLDER;
    public int runModel(String filePath,String user) {

        File Path = new File(SAVE_FOLDER + "picture/"+user+"/"+filePath);
        if(!Path.exists()){
            boolean result = Path.mkdirs();
            if(!result){
                return 1;
            }
        }

        Path = new File(SAVE_FOLDER + "data/"+user+"/"+filePath);
        if(!Path.exists()){
            boolean result = Path.mkdirs();
            if(!result){
                return 1;
            }
        }
        try {
            // 这里最好为绝对路径
            String pythonScriptPath = "BaseWeb/src/main/resources/model/finCode-Copy2.py";  // 替换为你的Python脚本路径

            String param1 = "Hello"; //传递到脚本的参数
            String param2 = "World";
            String dataPath = UPLOAD_FOLDER + filePath;
            // "python" 是你电脑的python可执行程序的路径，告诉函数需要用什么来运行脚本
            // 也可替换为python.exe的绝对路径
            // 这条语句等于在黑窗口中输入：python path/to/your/script.py Hello World
            ProcessBuilder processBuilder = new ProcessBuilder("python", pythonScriptPath,dataPath,user,filePath);

            // 启动python.exe开始执行脚本
            Process process = processBuilder.start();

            // InputStreamReader:这个类用于将输入流(比如进程的输入流)转换为字符流，字符流可以被BufferedReader读取。
            // 它接受一个InputStream作为参数，并提供一个read方法，该方法返回一个character.process。
            // gettinputstream():这个方法返回进程的输入流。
            // 流程具有可用于与流程通信的输入和输出流。
            // 在这种情况下，输入流用于从进程的标准输入中读取字符。
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

            // 读取标准输出
            String line;
            String a;
            while ((line = reader.readLine()) != null) {
                // 读取Python脚本的输出，并处理返回的数据
//                System.out.println("Python script output: " + line);
                if(line.startsWith("1:")){
                    a = line.substring("1:".length());
//                    System.out.println("获取数据为：a:"+a);
                }
            }

            // 读取错误输出
            BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            while ((line = errorReader.readLine()) != null) {
                // 读取Python脚本的错误输出，并处理返回的数据
                System.err.println("Python script error: " + line);

            }

            int exitCode = process.waitFor(); // 等待脚本执行结束后获取返回的状态码
//            System.out.println("Python script executed with exit code " + exitCode);
            log.info("运行的结果为：{}",exitCode==0?"成功":"失败");
            return exitCode;
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
            return 1;
        }
    }
}
